#include "key.h"
#include "stm32f4xx_hal_def.h"

void KeyGet(uint8_t * key)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	uint8_t i;
	*key = 0;
	for(i=0;i<3;i++)
	{
		GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
		GPIO_InitStruct.Pull = GPIO_PULLUP;
		GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM;
		switch(i)
		{
		case 0:
			GPIO_InitStruct.Pin = KEY_UP_DW_PIN;
			HAL_GPIO_Init(KEY_UP_DW_PORT, &GPIO_InitStruct);
			HAL_GPIO_WritePin(KEY_UP_DW_PORT, GPIO_InitStruct.Pin, GPIO_PIN_RESET);
			break;
		case 1:
			GPIO_InitStruct.Pin = KEY_LF_R_PIN;
			HAL_GPIO_Init(KEY_LF_R_PORT, &GPIO_InitStruct);
			HAL_GPIO_WritePin(KEY_LF_R_PORT, GPIO_InitStruct.Pin, GPIO_PIN_RESET);
			break;
		case 2:
			GPIO_InitStruct.Pin = KEY_EN_ESC_PIN;
			HAL_GPIO_Init(KEY_EN_ESC_PORT, &GPIO_InitStruct);
			HAL_GPIO_WritePin(KEY_EN_ESC_PORT, GPIO_InitStruct.Pin, GPIO_PIN_RESET);
			break;
		default : break;
		}
		if(!(KEY_LINE0_PORT->IDR & KEY_LINE0_PIN))
		{
			switch(i)
			{
			case 0: *key = KEY_DW; break;
			case 1: *key = KEY_LF; break;
			case 2: *key = KEY_ES; break;
			default : break;
			}
		}
		if(!(KEY_LINE1_PORT->IDR & KEY_LINE1_PIN))
		{
			switch(i)
			{
			case 0: *key = KEY_UP; break;
			case 1: *key = KEY_RG; break;
			case 2: *key = KEY_EN; break;
			default : break;
			}
		}
		GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
		GPIO_InitStruct.Pull = GPIO_NOPULL;
		GPIO_InitStruct.Pin = KEY_LINE0_PIN;
		HAL_GPIO_Init(KEY_LINE0_PORT, &GPIO_InitStruct);
		GPIO_InitStruct.Pin = KEY_LINE1_PIN;
		HAL_GPIO_Init(KEY_LINE1_PORT, &GPIO_InitStruct);
		GPIO_InitStruct.Pin = KEY_UP_DW_PIN;
		HAL_GPIO_Init(KEY_UP_DW_PORT, &GPIO_InitStruct);
		GPIO_InitStruct.Pin = KEY_LF_R_PIN;
		HAL_GPIO_Init(KEY_LF_R_PORT, &GPIO_InitStruct);
		GPIO_InitStruct.Pin = KEY_EN_ESC_PIN;
		HAL_GPIO_Init(KEY_EN_ESC_PORT, &GPIO_InitStruct);
	}
}

void KeyGPIO_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	LED_RCC_AHB1_EN;
	RCC->KEY_RCC_APB |= KEY_RCC_AHB1_EN;
	//KEY_RCC_AHB1_EN();	// Line 0
	GPIO_InitStruct.Pin = KEY_LINE0_PIN;
	GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM;
	HAL_GPIO_Init(KEY_LINE0_PORT, &GPIO_InitStruct);
	// Line 1
	GPIO_InitStruct.Pin = KEY_LINE1_PIN;
	GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM;
	HAL_GPIO_Init(KEY_LINE1_PORT, &GPIO_InitStruct);
	// UPDW
	GPIO_InitStruct.Pin = KEY_UP_DW_PIN;
	GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
	GPIO_InitStruct.Pull = GPIO_PULLUP;
	GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM;
	HAL_GPIO_Init(KEY_UP_DW_PORT, &GPIO_InitStruct);
	// LF-RG
	GPIO_InitStruct.Pin = KEY_LF_R_PIN;
	GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
	GPIO_InitStruct.Pull = GPIO_PULLUP;
	GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM;
	HAL_GPIO_Init(KEY_LF_R_PORT, &GPIO_InitStruct);
	// EN-ESC
	GPIO_InitStruct.Pin = KEY_EN_ESC_PIN;
	GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
	GPIO_InitStruct.Pull = GPIO_PULLUP;
	GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM;
	HAL_GPIO_Init(KEY_EN_ESC_PORT, &GPIO_InitStruct);
	// led1
	GPIO_InitStruct.Pin = LED_RED_PIN;
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM;
	HAL_GPIO_Init(LED_RED_PORT, &GPIO_InitStruct);
	// led2
	GPIO_InitStruct.Pin = LED_GREEN_PIN;
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM;
	HAL_GPIO_Init(LED_GREEN_PORT, &GPIO_InitStruct);
	HAL_GPIO_WritePin(LED_RED_PORT, LED_RED_PIN, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(LED_GREEN_PORT, LED_GREEN_PIN, GPIO_PIN_SET);
}
